package com.eber.demo.design.factory.abstraction;


// 抽象产品A
interface ProductA {
    void useProductA();
}

// 具体产品A1
class ConcreteProductA1 implements ProductA {
    public void useProductA() {
        System.out.println("使用产品A1");
    }
}

// 具体产品A2
class ConcreteProductA2 implements ProductA {
    public void useProductA() {
        System.out.println("使用产品A2");
    }
}

// 抽象产品B
interface ProductB {
    void useProductB();
}

// 具体产品B1
class ConcreteProductB1 implements ProductB {
    public void useProductB() {
        System.out.println("使用产品B1");
    }
}

// 具体产品B2
class ConcreteProductB2 implements ProductB {
    public void useProductB() {
        System.out.println("使用产品B2");
    }
}

// 抽象工厂
interface Factory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂
class ConcreteFactory implements Factory {
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// ======================================================================

public class FactoryAbstract {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        ProductA productA = factory.createProductA();
        ProductB productB = factory.createProductB();

        productA.useProductA();
        productB.useProductB();
    }
}
